<?php
class Water{
    protected $water;
    #使用构造函数传递水印图片
    public function __construct(string $water)
    {
        $this->water = $water;
    }

    #对外公开的接口
    public function make(string $image,string $filename=null,int $pos = 9){
        #检测文件异常情况
        $this->fileError($image);
        #得到了图片资源
        $res = $this->resource($image);
        #水印图片
        $waterImg = $this->resource($this->water);
        #水印位置
        $position = $this->position($res,$waterImg,$pos);
        #给图片添加水印
        imagecopy($res,$waterImg,$position['x'],$position['y'],0,0,imagesx($waterImg),imagesy($waterImg));
        #图片的展示形式
        $this->showAction($image)($res,$filename??$image);
        #显示图片在浏览器中
        header('Content-Type:image/png');
        $this->showAction($image)($res);
    }

    #检测文件异常情况
    protected function fileError(string $image){
        if(!is_file($image) || !getimagesize($image)){
            throw new Exception('文件异常');
        }
    }

    #根据图片生成资源对象
    #动态根据图像资源，获取图像的加载类型
    protected function resource(string $image){
        $info = getimagesize($image);
        $functions = [1=>'imagecreatefromgif',2=>'imagecreatefromjpeg',3=>'imagecreatefrompng'];
        #$info[2]  代表当前图片资源的类型
        $call = $functions[$info[2]];
        return $call($image);
    }

    #设定水印图片的位置
    #$des -> 原图的资源
    #$res -> 水印图片的资源
    #$pos -> 水印的位置
    protected function position($des,$res,$pos){
        $info = ['x'=>0,'y'=>0];
        switch ($pos){
            case 1:
                break;
            case 2:
                $info['x'] = (imagesx($des) - imagesx($res))/2;
                break;
            case 3:
                $info['x'] = (imagesx($des)-imagesx($res));
                break;
            case 4:
                $info['y'] = (imagesy($des)-imagesy($res))/2;
                break;
            case 5:
                $info['x'] = (imagesx($des)-imagesx($res))/2;
                $info['y'] = (imagesy($des)-imagesy($res))/2;
                break;
            case 6:
                $info['x'] = (imagesx($des)-imagesx($res));
                $info['y'] = (imagesy($des)-imagesy($res))/2;
                break;
            case 7:
                $info['y'] = imagesy($des) - imagesy($res);
                break;
            case 8:
                $info['x'] = (imagesx($des)-imagesx($res))/2;
                $info['y'] = imagesy($des) - imagesy($res);
                break;
            case 9:
                $info['x'] = imagesx($des) - imagesx($res);
                $info['y'] = imagesy($des) - imagesy($res);
                break;
        }
        return $info;
    }


    #图片的展示方式
    protected function showAction(string $image){
        $info = getimagesize($image);
        $functions = [1=>'imagegif',2=>'imagejpeg',3=>'imagepng'];
        return $functions[$info[2]];
    }



}